/**
 * @file log.cpp
 * @brief 用spdlog封装日志库
 * @author ypj
 * @date 2022年10月27日
 * @license MIT Apache2.0
 * Copyright (C), 2010-2022 Jouav Co., Ltd.
 */
#include "log.h"
#include <chrono>
#include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>

std::shared_ptr<spdlog::logger> log_sys = NULL;	//系统相关的日志
//std::shared_ptr<spdlog::logger> log_msg = NULL;	//消息数据处理相关的日志


#define LOG_BASE_PATH "/media/log/datalinksim-clouds"
#define LOG_NAME "datalinksim-clouds.txt"
/**
* @brief 初始化一个日志
* @param log_path 输入：日志存放路径，最末尾不放'/'
* @param log_name 输入：日志名称
* @param log 输出：初始化日志对象
* @return 0：成功 -1：失败
*/
static int add_log_init(const std::string log_path, const std::string& log_name, std::shared_ptr<spdlog::logger>& log)
{
	try
	{
		std::string log_path_name = log_path + "/" + log_name;
		if (log_path[log_path.size() - 1] == '/')
		{
			log_path_name = log_path + log_name;
		}
		//初始化版本日志
		auto ver_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
		auto file_ver = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(log_path_name, 1024 * 1024 * 3, 19, true);	//系统日志文件
		if (!file_ver)
		{
			std::string tmp_log_path = "/tmp/log/" + log_name;
			file_ver = std::make_shared<spdlog::sinks::rotating_file_sink_mt>(tmp_log_path, 1024 * 1024 * 3, 19, true);	//临时系统日志文件
			//printf("log addr = null ,new addr = %x \n", file_ver);
		}
		log = std::make_shared<spdlog::logger>("ver", spdlog::sinks_init_list({ ver_sink, file_ver }));
		log->flush_on(spdlog::level::info);
		log->set_level(spdlog::level::info);
	}
	catch (const spdlog::spdlog_ex& e)
	{
		printf("spdlog %s error %s\n", log_name.c_str(), e.what());
		return -1;
	}
	return 0;
}

/**
* @brief 日志初始化接口
* @param base_path 输入存放日志的路径-放在sd卡中
* @return int 0:成功；-1:初始化失败
*/
int init_log(const std::string& base_path)
{
	std::string strpath = LOG_BASE_PATH;
	if (base_path.size() > 0) 
	{
		strpath = base_path;
	}

	int ret = add_log_init(strpath, LOG_NAME, log_sys);
	if (ret != 0)
	{
		printf("%s init failed.", LOG_NAME);
		return -1;
	}
	spdlog::flush_every(std::chrono::seconds(2));
	spdlog::set_pattern("[%y-%m-%d %H:%M:%S] [%l] [%n],%v");
	
	return 0;
}